package UI.usuariosinautenticar;

import excepciones.Excepcion1;
import gestorBD.Controlador;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import uiMain.bienRaizOk;
import static uiMain.bienRaizOk.ventana;

public class PanelUsuarioSinAutenticar extends JPanel {

    JPanel panelIzquierdo;
    JPanel panelDerecho;
    JPanel P5;
    JTextArea T1;
    JScrollPane scroll;
    JPanel P6;
    JButton botonAdministrador;
    JButton botonFuncionario;
    JLabel labelIngreseNombre;
    JLabel labelCedula;
    JTextField campoCedula;
    JLabel labelContrasenha;
    JPasswordField campoContrasenha;
    JButton botonSalir;
    JPanel P3;
    JLabel L1;
    JPanel P4;
    JLabel labelImagen;

    boolean esPrimerClick = true;
    boolean esSegundoClick = false;

    public PanelUsuarioSinAutenticar() {
        super();

        this.setLayout(new GridLayout(1, 2));

        //-------Creación panel izquierdo---------------------------------------------------
        panelIzquierdo = new JPanel(new BorderLayout());
        //panelIzquierdo.setBackground(Color.yellow);

        //Se crea el panel P5 que contendrá el T1 con el saludo sobrio.
        P5 = new JPanel();
        T1 = new JTextArea("Trabajo práctico #2 - Programación orientada a objetos.\n\nEste programa está diseñado para la administración "
                + "de una agencia de bienes raíces. En resumen, permite gestionar una pequeña base de datos que almacena información"
                + " sobre inmuebles, clientes y contratos; a través de funcionarios registrados con funciones autorizadas por un "
                + "administrador del sistema.\n\nDesarrollado por Yennifer Marcela Tobón, Juan Diego Merino, Nicolás Henao y Simón Palacio. "
                + "Estudiantes de ingeniería de sistemas e informática de la Universidad Nacional de Colombia, sede Medellín.");
        T1.setColumns(36);
        T1.setRows(4);
        T1.setLineWrap(true);
        T1.setWrapStyleWord(true);
        T1.setEditable(false);
        scroll = new JScrollPane(T1, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        P5.add(scroll);

        //Se crea el panel P6 para el inicio de la sesión
        P6 = new JPanel(new GridBagLayout());
        //P6.setBackground(Color.green);
        GridBagConstraints c = new GridBagConstraints();

        //Se crea y se ubica el boton de administrador 
        botonAdministrador = new JButton("Administrador");
        c.fill = 1;
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 1;
        c.gridheight = 1;
        P6.add(botonAdministrador, c);

        //Se crea y se ubica el boton de funcionario 
        botonFuncionario = new JButton("Funcionario");
        c.fill = 1;
        c.gridx = 1;
        c.gridy = 0;
        c.gridwidth = 1;
        c.gridheight = 1;
        P6.add(botonFuncionario, c);

        //Se crea y se ubica el label "Ingrese su ID y su contraseña" 
        labelIngreseNombre = new JLabel("Ingrese su ID y contraseña");
        c.fill = 0;
        c.gridx = 0;
        c.gridy = 1;
        c.gridwidth = 2;
        c.gridheight = 1;
        P6.add(labelIngreseNombre, c);
        labelIngreseNombre.setVisible(false);

        //Se crea y se ubica el label "Cédula:" 
        labelCedula = new JLabel("Cédula:");
        c.gridx = 0;
        c.gridy = 2;
        c.gridwidth = 1;
        c.gridheight = 1;
        P6.add(labelCedula, c);
        labelCedula.setVisible(false);

        //Se crea y se ubica el cuadro de texto para ingresar la cedula
        campoCedula = new JTextField();
        campoCedula.setColumns(12);
        c.gridx = 1;
        c.gridy = 2;
        c.gridwidth = 1;
        c.gridheight = 1;
        P6.add(campoCedula, c);
        campoCedula.setVisible(false);

        //Se crea y se ubica el label "Contraseña:" 
        labelContrasenha = new JLabel("Contraseña:");
        c.gridx = 0;
        c.gridy = 3;
        c.gridwidth = 1;
        c.gridheight = 1;
        P6.add(labelContrasenha, c);
        labelContrasenha.setVisible(false);

        //Se crea y se ubica el cuadro de texto para ingresar la contraseña
        campoContrasenha = new JPasswordField();
        campoContrasenha.setColumns(12);
        c.gridx = 1;
        c.gridy = 3;
        c.gridwidth = 1;
        c.gridheight = 1;
        P6.add(campoContrasenha, c);
        campoContrasenha.setVisible(false);

        //Se crea y se ubica el boton salir
        botonSalir = new JButton("Salir");
        c.fill = 1;
        c.gridx = 0;
        c.gridy = 4;
        c.gridwidth = 2;
        c.gridheight = 1;
        P6.add(botonSalir, c);

        panelIzquierdo.add(P5, BorderLayout.NORTH);
        panelIzquierdo.add(P6, BorderLayout.CENTER);
        //-------Finaliza creación panel izquierdo---------------------------------------------------

        //-------Creación del panel derecho--------------------------------------------------------------
        panelDerecho = new JPanel(new BorderLayout());

        //Se agrega el label de la bienvenida al programa
        P3 = new JPanel(new BorderLayout());
        L1 = new JLabel("<html><center>Bienvenido al sistema de Bien Raíz OK. Por favor identifíquese con su usuario y contraseña</center></html>");
        P3.add(L1, BorderLayout.CENTER);

        //Se crea el contenedor del botón gigante
        P4 = new JPanel(new BorderLayout());
        labelImagen = new JLabel("Haga clic aquí para ver fotos de Bien Raiz OK", SwingConstants.CENTER);
        labelImagen.setIcon(null);
        P4.add(labelImagen, BorderLayout.CENTER);

        panelDerecho.add(P3, BorderLayout.NORTH);
        panelDerecho.add(P4, BorderLayout.CENTER);
        //-------Finaliza creación panel derecho-------------------------------------------------------

        //Se agregan las funcionalidades
        botonAdministrador.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (botonAdministrador.getText().equals("Administrador")) {
                    labelIngreseNombre.setVisible(true);
                    labelCedula.setVisible(true);
                    campoCedula.setVisible(true);
                    campoCedula.setText("");
                    labelContrasenha.setVisible(true);
                    campoContrasenha.setVisible(true);
                    campoContrasenha.setText("");
                    botonAdministrador.setText("Administrador complete y nuevamente click");
                    botonFuncionario.setText("Funcionario");
                    campoCedula.requestFocusInWindow();
                } else {
                    if (campoCedula.getText().length() == 0 && campoContrasenha.getPassword().length == 0) {
                        try {
                            throw new Excepcion1();
                        } catch (Excepcion1 ex) {
                            String textoPopUp = "Por favor ingrese toda la información";
                            JOptionPane.showMessageDialog(null, textoPopUp, "Login incorrecto", JOptionPane.ERROR_MESSAGE);
                            return;
                        }
                    }
                    iniciarSesionComoAdministrador();

                }
            }
        });

        botonFuncionario.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (botonFuncionario.getText().equals("Funcionario")) {
                    labelIngreseNombre.setVisible(true);
                    labelCedula.setVisible(true);
                    campoCedula.setVisible(true);
                    campoCedula.setText("");
                    labelContrasenha.setVisible(true);
                    campoContrasenha.setVisible(true);
                    campoContrasenha.setText("");
                    botonFuncionario.setText("Funcionario complete y nuevamente click");
                    botonAdministrador.setText("Administrador");
                    campoCedula.requestFocusInWindow();
                } else {
                    if (campoCedula.getText().length() == 0 && campoContrasenha.getPassword().length == 0) {
                        try {
                            throw new Excepcion1();
                        } catch (Excepcion1 ex) {
                            String textoPopUp = "Por favor ingrese toda la información";
                            JOptionPane.showMessageDialog(null, textoPopUp, "Login incorrecto", JOptionPane.ERROR_MESSAGE);
                            return;
                        }
                    }
                    iniciarSesionComoFuncionario();
                }

            }
        });

        campoContrasenha.addActionListener(new ActionListener() {//Para poder iniciar sesión con la tecla ENTER

            @Override
            public void actionPerformed(ActionEvent e) {
                if (botonAdministrador.getText().equals("Administrador")) {
                    iniciarSesionComoFuncionario();
                } else {
                    iniciarSesionComoAdministrador();
                }
            }

        });

        P4.addMouseListener(new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent e) {
                if (esPrimerClick) {
                    esPrimerClick = false;
                    esSegundoClick = true;
                    Icon icono = new ImageIcon(bienRaizOk.class.getResource("../resources/fachada.png"));
                    labelImagen.setIcon(icono);
                    labelImagen.setText("");
                } else if (esSegundoClick) {
                    esSegundoClick = false;
                    Icon icono = new ImageIcon(bienRaizOk.class.getResource("../resources/gifInmuebles.gif"));
                    labelImagen.setIcon(icono);
                } else {
                    esPrimerClick = true;
                    labelImagen.setText("Haga clic aquí para ver fotos de Bien Raíz OK");
                    labelImagen.setIcon(null);
                }
            }

            @Override
            public void mousePressed(MouseEvent e) {

            }

            @Override
            public void mouseReleased(MouseEvent e) {

            }

            @Override
            public void mouseEntered(MouseEvent e) {

            }

            @Override
            public void mouseExited(MouseEvent e) {

            }

        });

        botonSalir.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                String ObjButtons[] = {"Sí", "No", "Cancelar"};
                int PromptResult = JOptionPane.showOptionDialog(null, "¿Desea guardar los cambios en el XML antes de salir?", "Guardar cambios", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, null, ObjButtons, ObjButtons[1]);
                if (PromptResult == JOptionPane.YES_OPTION) {
                    Controlador.guardarXML();
                    System.out.println("XML actualizado correctamente");
                    System.exit(0);
                } else if (PromptResult == JOptionPane.NO_OPTION) {
                    System.exit(0);
                } else if (PromptResult == JOptionPane.CANCEL_OPTION) {
                    //No hacer nada
                }
            }
        });

        L1.addMouseListener(new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent e) {

            }

            @Override
            public void mousePressed(MouseEvent e) {

            }

            @Override
            public void mouseReleased(MouseEvent e) {

            }

            @Override
            public void mouseEntered(MouseEvent e) {
                L1.setForeground(Color.red);
            }

            @Override
            public void mouseExited(MouseEvent e) {
                L1.setForeground(Color.black);
            }

        });

        //Se le agregan los dos paneles al frame principal
        this.add(panelIzquierdo);
        this.add(panelDerecho);
    }

    private void iniciarSesionComoAdministrador() {
        long cedula = -1;
        try {
            cedula = Long.parseLong(campoCedula.getText().trim());
        } catch (Exception e) {
            String textoPopUp = "Su cédula no es válida. Ingrese solo números sin puntos, comas ni espacios en blanco";
            JOptionPane.showMessageDialog(null, textoPopUp, "Login incorrecto", JOptionPane.ERROR_MESSAGE);
            campoCedula.setText("");
            return;
        }
        String contrasenha = String.valueOf(campoContrasenha.getPassword());
        boolean inicioCorrecto = Controlador.iniciarSesionComoAdministrador(cedula, contrasenha);
        if (inicioCorrecto) {
            ventana.mostrarPanelBienvenidaAdministrador();
        } else {
            popUpLoginIncorrecto();
            campoCedula.requestFocusInWindow();
        }
    }

    private void iniciarSesionComoFuncionario() {
        long cedula = -1;
        try {
            cedula = Long.parseLong(campoCedula.getText().trim());
        } catch (Exception e) {
            String textoPopUp = "Su cédula no es válida. Ingrese solo números sin puntos, comas ni espacios en blanco";
            JOptionPane.showMessageDialog(null, textoPopUp, "Login incorrecto", JOptionPane.ERROR_MESSAGE);
            campoCedula.setText("");
            return;
        }
        String contrasenha = String.valueOf(campoContrasenha.getPassword());
        boolean inicioCorrecto = Controlador.iniciarSesionComoFuncionario(cedula, contrasenha);
        if (inicioCorrecto) {
            ventana.mostrarPanelBienvenidaFuncionario();
        } else {
            popUpLoginIncorrecto();
            campoCedula.requestFocusInWindow();
        }
    }

    private void popUpLoginIncorrecto() {
        String textoPopUp = "Información incorrecta. Por favor verifíquela e intente nuevamente";
        JOptionPane.showMessageDialog(null, textoPopUp, "Login incorrecto", JOptionPane.ERROR_MESSAGE);
        campoCedula.setText("");
        campoContrasenha.setText("");
    }
}
